# save_scanned_images.py
"""
图像扫描结果保存工具
功能：将扫描和透视变换后的图像保存到本地文件夹
"""

import cv2
import numpy as np
import base64
import os
from datetime import datetime
from scan import scan_image
from db import Database


def save_scanned_image_from_file(image_path, output_dir='scanned_images'):
    """
    从本地文件读取图像，进行扫描处理并保存结果

    Args:
        image_path (str): 输入图像文件路径
        output_dir (str): 输出文件夹路径

    Returns:
        str: 保存的文件路径
    """
    # 创建输出目录
    os.makedirs(output_dir, exist_ok=True)

    try:
        # 读取图像文件
        with open(image_path, 'rb') as f:
            image_data = f.read()

        # 进行扫描处理
        scanned_image_data = scan_image(image_data)

        # 生成文件名
        timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
        original_filename = os.path.splitext(os.path.basename(image_path))[0]
        output_filename = f"{original_filename}_scanned_{timestamp}.jpg"
        output_path = os.path.join(output_dir, output_filename)

        # 保存扫描后的图像
        with open(output_path, 'wb') as f:
            f.write(scanned_image_data)

        print(f"✅ 扫描图像已保存: {output_path}")
        return output_path

    except Exception as e:
        print(f"❌ 处理图像时出错: {str(e)}")
        return None


def save_scanned_image_from_base64(base64_string, output_dir='scanned_images', prefix='scanned'):
    """
    从Base64字符串读取图像，进行扫描处理并保存结果

    Args:
        base64_string (str): Base64编码的图像数据
        output_dir (str): 输出文件夹路径
        prefix (str): 文件名前缀

    Returns:
        str: 保存的文件路径
    """
    # 创建输出目录
    os.makedirs(output_dir, exist_ok=True)

    try:
        # 解码Base64数据
        image_data = base64.b64decode(base64_string)

        # 进行扫描处理
        scanned_image_data = scan_image(image_data)

        # 生成文件名
        timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
        output_filename = f"{prefix}_{timestamp}.jpg"
        output_path = os.path.join(output_dir, output_filename)

        # 保存扫描后的图像
        with open(output_path, 'wb') as f:
            f.write(scanned_image_data)

        print(f"✅ 扫描图像已保存: {output_path}")
        return output_path

    except Exception as e:
        print(f"❌ 处理Base64图像时出错: {str(e)}")
        return None


def save_all_database_images(output_dir='scanned_images'):
    """
    从数据库中读取所有图像，进行扫描处理并保存结果

    Args:
        output_dir (str): 输出文件夹路径
    """
    # 创建输出目录
    os.makedirs(output_dir, exist_ok=True)

    try:
        # 连接数据库
        db = Database()
        images = db.get_images()  # 假设这个方法返回所有图像记录

        saved_count = 0
        for i, image_record in enumerate(images):
            try:
                # 从数据库记录中获取扫描后的Base64数据
                scanned_base64 = image_record.get('scanned_image')
                if scanned_base64:
                    # 生成文件名
                    timestamp = image_record.get('upload_time', datetime.now().strftime('%Y%m%d_%H%M%S'))
                    output_filename = f"database_image_{i + 1}_{timestamp}.jpg"
                    output_path = os.path.join(output_dir, output_filename)

                    # 解码并保存
                    image_data = base64.b64decode(scanned_base64)
                    with open(output_path, 'wb') as f:
                        f.write(image_data)

                    print(f"✅ 数据库图像已保存: {output_path}")
                    saved_count += 1
                else:
                    print(f"⚠️  图像记录 {i + 1} 没有扫描数据")

            except Exception as e:
                print(f"❌ 处理数据库图像 {i + 1} 时出错: {str(e)}")
                continue

        print(f"📊 总共保存了 {saved_count} 张扫描图像")

    except Exception as e:
        print(f"❌ 访问数据库时出错: {str(e)}")


def batch_process_images(input_dir='images', output_dir='scanned_images'):
    """
    批量处理文件夹中的所有图像

    Args:
        input_dir (str): 输入图像文件夹路径
        output_dir (str): 输出文件夹路径
    """
    # 支持的图像格式
    image_extensions = ('.jpg', '.jpeg', '.png', '.bmp', '.tiff')

    # 获取所有图像文件
    image_files = []
    for filename in os.listdir(input_dir):
        if filename.lower().endswith(image_extensions):
            image_files.append(os.path.join(input_dir, filename))

    if not image_files:
        print("⚠️  输入文件夹中没有找到图像文件")
        return

    print(f"📁 找到 {len(image_files)} 个图像文件")

    # 创建输出目录
    os.makedirs(output_dir, exist_ok=True)

    # 处理每个图像文件
    processed_count = 0
    for image_path in image_files:
        try:
            output_path = save_scanned_image_from_file(image_path, output_dir)
            if output_path:
                processed_count += 1
        except Exception as e:
            print(f"❌ 处理文件 {image_path} 时出错: {str(e)}")
            continue

    print(f"📊 批量处理完成，成功处理 {processed_count}/{len(image_files)} 个文件")


# 使用示例
if __name__ == "__main__":
    print("📸 图像扫描保存工具")
    print("=" * 50)

    # 示例1: 处理单个文件
    save_scanned_image_from_file('../images/11.jpg')

    # 示例2: 批量处理文件夹
    # batch_process_images('images', 'scanned_output')

    # 示例3: 从Base64处理
    # save_scanned_image_from_base64('your_base64_string_here', 'scanned_images', 'test')

    # 示例4: 从数据库保存所有图像
    # save_all_database_images('database_scanned')

    print("💡 使用方法:")
    print("1. 处理单个文件: save_scanned_image_from_file('path/to/image.jpg')")
    print("2. 批量处理: batch_process_images('input_folder', 'output_folder')")
    print("3. Base64处理: save_scanned_image_from_base64('base64_string')")
    print("4. 数据库导出: save_all_database_images('output_folder')")